﻿// 检查是否是VBA代码
function isVBACode(code) {
    // 去除注释
    code = code.replace(/'.*$/gm, '');

    // 匹配 Sub 或 Function 块
    const pattern = /^\s*(Sub|Function)\b[\s\S]*?(End (Sub|Function))\s*$/i;
    return pattern.test(code);
}


// 提取代码并保留换行符
function extractCodeWithFormatting(preElement) {
    const lines = preElement.querySelectorAll('.cm-line'); // 获取每一行代码
    let code = '';
    lines.forEach(line => {
        code += line.textContent + '\n'; // 拼接每一行代码并添加换行符
    });
    return code.trim(); // 去除首尾空白
}

// 创建运行按钮
function createRunButton(preElement) {
    const btn = document.createElement('button');
    btn.className = 'run-code-button bg-none border-none bg-gray-50 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 transition rounded-md px-1.5 py-0.5';
    btn.textContent = '▶️ 运行';
    btn.style.color = '#756FE9';

    btn.addEventListener('click', () => {
        // 提取代码并保留换行符
        const code = extractCodeWithFormatting(preElement);

        // 检查是否是VBA代码
        if (isVBACode(code)) {
            // 将 VBA 代码进行 URL 编码
            const encodedCode = encodeURIComponent(code);

            // 将 VBA 代码发送给 C# 后端
            window.chrome.webview.postMessage({
                type: 'runVBA',
                code: encodedCode // 传输编码后的 VBA 代码
            });
        } else {
            alert('这不是有效的VBA代码');
        }
    });
    return btn;
}

// 创建收藏按钮
function createFavoriteButton(preElement) {
    const btn = document.createElement('button');
    btn.className = 'favorite-code-button bg-none border-none bg-gray-50 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 transition rounded-md px-1.5 py-0.5';
    btn.textContent = '❤️ 收藏';
    btn.style.color = '#756FE9';

    btn.addEventListener('click', () => {
        // 提取代码并保留换行符
        const code = extractCodeWithFormatting(preElement);

        // 检查是否是VBA代码
        if (isVBACode(code)) {
            // 将 VBA 代码发送给 C# 后端
            window.chrome.webview.postMessage({
                type: 'favoriteVBA',
                code: code
            });
        } else {
            alert('这不是有效的VBA代码');
        }
    });
    return btn;
}

// 将运行和收藏按钮添加到复制按钮旁边
function addButtonsToCodeBlock() {
    // 找到所有 VBA 代码区域
    const vbaCodeBlocks = document.querySelectorAll('.language-vba');
    vbaCodeBlocks.forEach((vbaCodeBlock) => {
        // 找到代码内容区域
        const codeContent = vbaCodeBlock.querySelector('.cm-content');
        if (!codeContent) return;

        // 找到复制按钮的父容器
        const buttonContainer = vbaCodeBlock.closest('.relative').querySelector('.flex.items-center.gap-0\\.5.translate-y-\\[1px\\]');
        if (!buttonContainer) return;

        // 检查是否已经存在运行和收藏按钮
        if (buttonContainer.querySelector('.run-code-button') || buttonContainer.querySelector('.favorite-code-button')) {
            return; // 如果已经存在按钮，跳过
        }

        // 创建运行和收藏按钮
        const runBtn = createRunButton(codeContent);
        const favoriteBtn = createFavoriteButton(codeContent);

        // 将按钮插入到复制按钮旁边
        buttonContainer.appendChild(runBtn);
        buttonContainer.appendChild(favoriteBtn);
    });
}

// 创建引用按钮
function createQuoteButton() {
    const btn = document.createElement('button');
    btn.className = 'quote-button text-[14px] cursor-pointer flex items-center justify-center py-1 mr-1 text-[#2C2C36] px-2 hover:bg-[#EDEFF5] hover:text-purple-500 dark:text-[#FFFFFF] dark:hover:bg-[#3A3A3E]';
    btn.style.borderRadius = '12px'; // 设置圆角
    btn.innerHTML = '📎 引用'; // 按钮文本

    btn.addEventListener('click', () => {
        console.log('点击了引用按钮，发送 getExcelSelection 消息');
        window.chrome.webview.postMessage({
            type: 'getExcelSelection'
        });
    });

    return btn;
}

// 监听来自 C# 后端的消息
window.chrome.webview.addEventListener('message', (event) => {
    const data = event.data;

    if (data.type === 'excelSelection') {
        // 找到 textarea
        const textarea = document.getElementById('chat-input');
        if (textarea) {
            // 将 Excel 选择范围内的数据插入到 textarea 中
            textarea.value = data.text;

            // 手动触发 input 事件，以更新发送按钮的状态
            const inputEvent = new Event('input', { bubbles: true });
            textarea.dispatchEvent(inputEvent);

            console.log('引用数据已插入到 textarea');
        } else {
            console.error('未找到 ID 为 chat-input 的 textarea 元素');
        }
    }
});

// 将引用按钮添加到目标容器
function addQuoteButtonToContainer() {
    // 找到目标容器
    const targetContainer = document.querySelector('.flex.items-center.left-content');
    if (!targetContainer) {
        console.error('未找到目标容器');
        return;
    }

    // 检查是否已经存在引用按钮
    if (targetContainer.querySelector('.quote-button')) {
        return; // 如果已经存在按钮，跳过
    }

    // 创建引用按钮
    const quoteBtn = createQuoteButton();

    // 将引用按钮插入到目标容器中
    targetContainer.append(quoteBtn);
    console.log('引用按钮已添加到目标容器');
}

// 创建全局上传按钮并添加到适当位置
function addGlobalUploadButton() {
    const targetContainer = document.querySelector('.flex.items-center.left-content');
    if (targetContainer && !targetContainer.querySelector('.ds-global-upload-button')) {
        const uploadBtn = document.createElement('button');
        uploadBtn.className = 'ds-global-upload-button text-[14px] cursor-pointer flex items-center justify-center py-1 mr-1 text-[#2C2C36] px-2 hover:bg-[#EDEFF5] hover:text-purple-500 dark:text-[#FFFFFF] dark:hover:bg-[#3A3A3E]';
        uploadBtn.style.borderRadius = '12px';
        uploadBtn.innerHTML = '📤 上传Excel';

        // 发送到C#后端，请求上传当前文件
        uploadBtn.addEventListener('click', () => {
            window.chrome.webview.postMessage({
                type: 'uploadWorkbook'
            });
        });

        targetContainer.appendChild(uploadBtn);
    }
}

// 自定义上传函数 - 接收来自C#的文件数据并直接上传
window.directUploadExcelFile = function (fileData, fileName, fileType) {
    try {
        // 查找文件上传控件
        const fileInput = document.querySelector('input[type="file"]');
        if (!fileInput) {
            window.chrome.webview.postMessage({
                type: 'uploadError',
                message: '未找到文件上传控件'
            });
            return;
        }

        // 创建包含文件数据的Blob对象
        const blob = base64ToBlob(fileData, fileType);

        // 创建包含文件的DataTransfer对象
        const dt = new DataTransfer();
        const file = new File([blob], fileName, { type: fileType });
        dt.items.add(file);

        // 将DataTransfer对象分配给文件输入元素
        fileInput.files = dt.files;

        // 触发change事件
        const event = new Event('change', { bubbles: true });
        fileInput.dispatchEvent(event);

        // 通知上传成功
        window.chrome.webview.postMessage({
            type: 'uploadStarted',
            fileName: fileName
        });

        // 对于某些网站可能需要自动提交表单
        const form = fileInput.closest('form');
        if (form) {
            // 可选：延迟提交表单
            setTimeout(() => {
                form.submit();
            }, 500);
        }
    } catch (error) {
        window.chrome.webview.postMessage({
            type: 'uploadError',
            message: '上传过程中出错: ' + error.message
        });
    }
};

// Base64字符串转Blob对象
function base64ToBlob(base64, mimeType) {
    // 解码Base64字符串
    const byteCharacters = atob(base64);
    const byteArrays = [];

    for (let offset = 0; offset < byteCharacters.length; offset += 1024) {
        const slice = byteCharacters.slice(offset, offset + 1024);

        const byteNumbers = new Array(slice.length);
        for (let i = 0; i < slice.length; i++) {
            byteNumbers[i] = slice.charCodeAt(i);
        }

        const byteArray = new Uint8Array(byteNumbers);
        byteArrays.push(byteArray);
    }

    return new Blob(byteArrays, { type: mimeType });
}

// 主函数
function init() {
    addButtonsToCodeBlock();
    addQuoteButtonToContainer(); // 添加引用按钮
    addGlobalUploadButton(); // 添加全局上传按钮
}

// 使用 MutationObserver 监听动态加载的内容
const observer = new MutationObserver((mutationsList) => {
    for (const mutation of mutationsList) {
        if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
            // 检查是否加载了 VBA 代码区域或目标容器
            const vbaCodeBlock = document.querySelector('.language-vba');
            const targetContainer = document.querySelector('.flex.items-center.left-content');
            if (vbaCodeBlock || targetContainer) {
                // 延迟执行 init，避免频繁调用
                setTimeout(init, 100);
                break;
            }
        }
    }
});

// 观察整个文档的变化
observer.observe(document.body, {
    childList: true,
    subtree: true
});

// 初始执行
init();